#pragma once
#include "Socket.h"
#include "EventLoop.h"
#include <string>
#include "Channel.h"
#include "InetAddress.h"
#include "Epoll.h"
#include "Acceptor.h"
#include<map>
#include"Connection.h"
#include"ThreadPool.h"
// TcpServer网路服务类
class TcpServer
{
    
public:
    TcpServer(std::string &ip, uint16_t &port,int threadNum);
    ~TcpServer();

    void start();
    void newConnection(Socket *clientsock);
    void closeconnection(spConnection conn);
    void errorconnection(spConnection conn);
    void onmessage(spConnection conn, std::string message);
    void sendcomplete(spConnection conn);
    void epolltimeout(EventLoop *loop);


    void setnewConnectioncb( std::function<void(spConnection)>  fn);
    void setcloseConnectioncb(std::function<void(spConnection)> fn);
    void seterrorConnectioncb(std::function<void(spConnection)> fn);
    void setonMessagecb(std::function<void(spConnection, std::string&)> fn);
    void setsendCompletecb(std::function<void(spConnection)> fn);
    void setepollTimeoutcb(std::function<void(EventLoop*)> fn); 
   
   

private:
    EventLoop* mainloop_; // 主事件循环 他、用来接受请求
    std::vector<EventLoop*> subloops_; // 从事件循环用来处理请求
    Acceptor *acceptor_;
    // 线程池
    ThreadPool *threadpool_; //线程池
    // 线程池的大小
    int threadNum_;  // 线程池的大小，有多少个从事件循环

    std::map<int,spConnection> conns_;
    std::function<void(spConnection)> newConnectioncb_; // 设置newConnection回调函数
    std::function<void(spConnection)> closeConnectioncb_; // 设置closeConnection回调函数
    std::function<void(spConnection)> errorConnectioncb_; // 错误回调函数
    std::function<void(spConnection, std::string& message)> onMessagecb_; //  消息回调函数
    std::function<void(spConnection)> sendCompletecb_; //     发送完成回调函数
    std::function<void(EventLoop *loop)> epollTimeoutcb_; // epoll超时回调函数
};
